package com.chant.startFarming.controller;


import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.chant.startFarming.dto.LoginFormDTO;
import com.chant.startFarming.dto.PasswordUpdateDTO;
import com.chant.startFarming.dto.Result;
import com.chant.startFarming.dto.UserDTO;
import com.chant.startFarming.entity.Users;
import com.chant.startFarming.service.IUsersService;
import com.chant.startFarming.utils.PermissionCheck;
import com.chant.startFarming.utils.RedisConstants;
import com.chant.startFarming.utils.UserHolder;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * <p>
 * 用户表，存储系统用户的基本信息 前端控制器
 * </p>
 *
 * @author chant
 * @since 2025-03-31
 */
@RestController
@RequestMapping("/users")
public class UsersController {

    @Autowired
    private IUsersService usersService;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    // 查询所有用户（分页）
//    @GetMapping
//    public Result getAllUsers(
//            @RequestParam(defaultValue = "1") Integer pageNum,
//            @RequestParam(defaultValue = "10") Integer pageSize) {
//        // 开始分页
//        PageHelper.startPage(pageNum, pageSize);
//        List<Users> users = usersService.list();
//
//        // 获取分页信息
//        PageInfo<Users> pageInfo = new PageInfo<>(users);
//
//        return Result.ok(users, pageInfo.getTotal());
//    }
    // 查询所有用户（不分页）
    @GetMapping
    public Result getAllUsers() {
        List<Users> users = usersService.list();
        return Result.ok(users);
    }


    // 根据ID查询用户
    @GetMapping("/{id}")
    public Result getUserById(@PathVariable Integer id) {
        Users user = usersService.getById(id);
        if (user != null) {
            return Result.ok(user);
        } else {
            return Result.fail("User not found");
        }
    }

    // 添加用户
    @PostMapping
    @PermissionCheck(1) // 1 表示管理员
    public Result addUser(@RequestBody Users user) {
        boolean saved = usersService.save(user);
        if (saved) {
            return Result.ok();
        } else {
            return Result.fail("Failed to add user");
        }
    }

    // 更新用户
    @PutMapping
    public Result updateUser(@RequestBody Users user) {
        boolean updated = usersService.updateById(user);
        if (updated) {
            return Result.ok();
        } else {
            return Result.fail("Failed to update user");
        }
    }

    // 删除用户
    @DeleteMapping("/{id}")
    public Result deleteUser(@PathVariable Integer id) {
        boolean deleted = usersService.removeById(id);
        if (deleted) {
            return Result.ok();
        } else {
            return Result.fail("Failed to delete user");
        }
    }



    // 根据用户名查询用户
    @GetMapping("/username/{username}")
    public Result getUserByUsername(@PathVariable String username) {
        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        List<Users> users = usersService.list(queryWrapper);
        if (!users.isEmpty()) {
            return Result.ok(users);
        } else {
            return Result.fail("未找到用户名为" + username + "的用户");
        }
    }

    // 根据username、phone、role模糊查找
    @GetMapping("/search")
    public Result searchUsers(
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String phone,
            @RequestParam(required = false) Integer role,
            @RequestParam(required = false) Integer userStatus,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize) {

        // 开始分页
        PageHelper.startPage(pageNum, pageSize);

        List<Users> users = usersService.searchUsers(name, phone, role, userStatus);
        PageInfo<Users> pageInfo = new PageInfo<>(users);

        return Result.ok(users, pageInfo.getTotal());
    }

    // 登录功能
    @PostMapping("/login")
    public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session) {
        return usersService.login(loginForm, session);
    }

    // 登出功能
    @PostMapping("/logout")
    public Result logout(@RequestHeader("token") String token) {
        // 1.获取并删除Redis中的token
        String key = RedisConstants.LOGIN_USER_KEY + token;
        Boolean deleted = stringRedisTemplate.delete(key);

        // 2.清除ThreadLocal中的用户信息
        UserHolder.removeUser();

        if (Boolean.TRUE.equals(deleted)) {
            return Result.ok("登出成功");
        }
        return Result.fail("登出失败或用户未登录");
    }

    // 获取当前登录用户信息
    @GetMapping("/me")
    public Result userInfo() {
        UserDTO userDTO = UserHolder.getUser();
        if (userDTO == null) {
            return Result.fail("用户未登录");
        }
        Users user = usersService.getById(userDTO.getId());
        if (user != null) {
            return Result.ok(user);
        } else {
            return Result.fail("用户不存在");
        }
    }

    // 上传头像
//    @PostMapping("/uploadAvatar")
//    public Result uploadAvatar(@RequestParam("file") MultipartFile file) {
//        // 检查用户是否登录
//        UserDTO user = UserHolder.getUser();
//        if (user == null) {
//            return Result.fail("用户未登录");
//        }
//
//        if (file.isEmpty()) {
//            return Result.fail("文件为空");
//        }
//
//        // 获取文件名和扩展名
//        String fileName = file.getOriginalFilename();
//        String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
//
//        // 生成唯一的文件名
//        String newFileName = UUID.randomUUID().toString() + "." + fileExtension;
//
//        // 文件保存路径
//        String uploadDir = "src/main/resources/static/uploads/avatar";
//        File dir = new File(uploadDir);
//        if (!dir.exists()) {
//            dir.mkdirs();
//        }
//
//        // 保存文件
//        try {
//            file.transferTo(new File(dir, newFileName));
//        } catch (IOException e) {
//            return Result.fail("文件保存失败");
//        }
//
//        // 返回文件的访问路径
//        String fileUrl = "/uploads/avatar/" + newFileName;
//        return Result.ok(fileUrl);
//    }

    // 修改个人信息
    @PutMapping("/me")
    public Result updateUserInfo(@RequestBody Users userUpdate) {
        UserDTO userDTO = UserHolder.getUser();
        if (userDTO == null) {
            return Result.fail("用户未登录");
        }
        Users user = usersService.getById(userDTO.getId());
        if (user == null) {
            return Result.fail("用户不存在");
        }
        // 更新用户信息
        user.setUsername(userUpdate.getUsername());
        user.setName(userUpdate.getName());
        user.setPhone(userUpdate.getPhone());
        user.setRole(userUpdate.getRole());
        boolean updated = usersService.updateById(user);
        if (updated) {
            return Result.ok("更新成功");
        } else {
            return Result.fail("更新失败");
        }
    }

    // 获取所有用户的名字和ID，用于下拉框
    @GetMapping("/managers")
    public Result getManagers() {
        List<Users> users = usersService.list();
        return Result.ok(users);
    }

    // UsersController.java 中添加以下方法

    @PutMapping("/updatePassword")
    public Result updatePassword(@RequestBody PasswordUpdateDTO passwordUpdateDTO) {
        // 获取当前登录用户
        UserDTO currentUser = UserHolder.getUser();
        if (currentUser == null) {
            return Result.fail("用户未登录");
        }

        // 查询数据库中的用户信息
        Users user = usersService.getById(currentUser.getId());
        if (user == null) {
            return Result.fail("用户不存在");
        }

        // 验证旧密码是否正确
        if (!user.getPassword().equals(passwordUpdateDTO.getOldPassword())) {
            return Result.fail("旧密码错误");
        }

        // 检查新密码是否合法（简单非空验证）
        if (passwordUpdateDTO.getNewPassword() == null || passwordUpdateDTO.getNewPassword().trim().isEmpty()) {
            return Result.fail("新密码不能为空");
        }

        // 新增：验证确认密码非空
        if (passwordUpdateDTO.getConfirmPassword() == null || passwordUpdateDTO.getConfirmPassword().trim().isEmpty()) {
            return Result.fail("确认密码不能为空");
        }

        // 新增：验证新密码与确认密码一致
        if (!passwordUpdateDTO.getNewPassword().equals(passwordUpdateDTO.getConfirmPassword())) {
            return Result.fail("新密码与确认密码不一致");
        }

        // 增强密码强度校验（示例：至少6位）
//        if (passwordUpdateDTO.getNewPassword().length() < 6) {
//            return Result.fail("密码长度不能少于6位");
//        }

        // 更新密码并保存到数据库
        user.setPassword(passwordUpdateDTO.getNewPassword());
        boolean updated = usersService.updateById(user);
        if (updated) {
            // 可选：清除用户登录状态，强制重新登录
            // 例如调用登出逻辑，此处根据需求决定是否添加
            return Result.ok("密码修改成功");
        } else {
            return Result.fail("密码更新失败");
        }
    }
}
